import xml.dom.minidom
import os
import time
from subprocess import call

# ---------------------------------------- Windows环境下载Android源码 ---------------------------------------- 

# 使用前提条件：
# 0、下载好python3.7环境，配置环境变量，powerShell 中python --version查看一下是否配置成功。
# 1、下载好git，配置环境变量，powerShell 中git --version查看一下是否配置成功。
# 2、使用清华园镜像下载android源码manifest文件，使用前查看tag，切换你需要的Android版本
# manifest文件下载 -> git clone git://mirrors.ustc.edu.cn/aosp/platform/manifest.git (中科大镜像)
# 		 		   -> git clone https://gitee.com/aosp-riscv/platform_manifest.git (码云仓库)
# 特别注意：
# download-src.py 文件要和manifest文件夹所处在同一个目录下！！！否则找不到manifest文件
# 使用说明：
# 打开powerShell，进入download-src.py 所在文件目录，执行：python .\download-src.py
# 源码下载前，会自动创建一个名为"source"文件夹，里面就是源码。
# 经历：
# 此方案为原理就是用git拉仓库，如果中途失败（网络不好），重新执行：python .\download-src.py 即可，自带断点下载功能。
# 下载源码之前，确认磁盘空间是否够用！
# 自测下载android-5.1.0_r1源码，300M的网速，下8个小时左右，占空间125GB。请先多预留10%以上的空间！

# ---------------------------------------- Windows环境下载Android源码 ---------------------------------------- 


basedir = os.path.abspath(os.path.dirname(__file__))
rootdir = basedir + os.sep + "source" + os.sep
print("rootdir = " +rootdir)
if not os.path.exists(rootdir):
    os.mkdir(rootdir)

dom = xml.dom.minidom.parse(basedir + os.sep + "manifest" + os.sep + "default.xml")
root = dom.documentElement

# 中科大镜像 git://mirrors.ustc.edu.cn/aosp/
# 清华源镜像 https://aosp.tuna.tsinghua.edu.cn/
# 以上两个源根据实际情况替换到mirrorsUrl中
prefix ="git clone -b "
mirrorsUrl = " git://mirrors.ustc.edu.cn/aosp/"
suffix = ".git"
 
 
# 获取manifest中的android版本号
tag = root.getElementsByTagName("default")[0].getAttribute("revision")
tagSplit = tag.split("/")
tag = tagSplit[len(tagSplit) - 1]

# 根据manifest中的版本号，确定资源目录名称
rootdir += tag

# 创建source下载文件夹（带版本号）
if not os.path.exists(rootdir):
    os.mkdir(rootdir)

# 记录下载耗时，单位：秒
time_format = "%Y-%m-%d %H:%M:%S"
start_time = time.time()
start_time_format = time.strftime(time_format, time.localtime(start_time))

for node in root.getElementsByTagName("project"):
    os.chdir(rootdir)
    d = node.getAttribute("path")
    last = d.rfind("/")
    if last != -1:
        d = rootdir + "/" + d[:last]
        if not os.path.exists(d):
            os.makedirs(d)
        os.chdir(d)
    cmd = prefix + tag + mirrorsUrl + node.getAttribute("name") + suffix;
    now_time = time.time()
    now_time_format = time.strftime(time_format, time.localtime(now_time)) 
    os.system(cmd)
    end_time = time.time()
    end_time_format = time.strftime(time_format, time.localtime(end_time)) 
    cost_time = int(end_time - now_time)
    print(cmd + " -> 耗时：%d"%cost_time+"秒")

# 记录一下结束耗时
final_time = time.time()
final_time_format = time.strftime(time_format, time.localtime(final_time))
totoal_cost_time_seconds =  int(final_time - start_time)
totoal_cost_time_minuts = int(totoal_cost_time_seconds / 60)
totoal_cost_time_hours = int(totoal_cost_time_minuts / 60)
totoal_cost_time_minuts_left = int(totoal_cost_time_minuts % 60)

print("源码下载起始时间："+start_time_format)
print("源码下载结束时间："+final_time_format)
print("本次下载"+tag+"版本源码，总耗时：%d"%totoal_cost_time_hours + "小时%d"%totoal_cost_time_minuts_left+"秒")